package pl.cezary.butler.walili.server;

import pl.cezary.butler.walili.server.db.Database;
import pl.cezary.butler.walili.server.db.utils.StorageBD;
import pl.cezary.butler.walili.server.db.tasks.GetTasksByDateTask;
import pl.cezary.butler.walili.common.TaskStatus;
import pl.cezary.butler.walili.common.Task;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.BlockingQueue;


// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
// #[regen=yes,id=DCE.48477D72-F97C-F245-3DB1-3F830A16D7C7]
// </editor-fold> 
public class RevalidationThread extends Thread {

    private final Queues kolejki; 
    private Timer timer;
    
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.CDDBB998-F6E0-62BC-9756-736E4C209EBA]
    // </editor-fold> 
    public RevalidationThread(Queues k) {
        super(RevalidationThread.class.getSimpleName());
        timer = new Timer("Revalidation timer");
        timer.scheduleAtFixedRate(new PonownePobieranie(), 0, TimeUnit.HOURS.toMillis(24));
        kolejki = k;
    }

    private void przywrocDoKolejkiZadan(ServerTask zad) {
        //zad.setStatus(TaskStatus.PRZERWANE);
        kolejki.reprocess(zad);
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.399306A0-9A9B-6B6A-938C-9A0D29984CB8]
    // </editor-fold> 
    @Override
    public void run() {
        BlockingQueue<DelayedServerTask> q = kolejki.getTasksToRevalidateQueue();
        
        while(!interrupted()){            
            try {
                przywrocDoKolejkiZadan(q.take().getZadanieSerwer());
                TimeUnit.MINUTES.sleep(5);
            } catch (InterruptedException ex) {
                break;
            } finally{
                timer.cancel();
            }
        }
    }    
    
    class PonownePobieranie extends TimerTask{
    
    @Override
    public void run() {
        Database baza = StorageBD.getBD();
        Calendar c = Calendar.getInstance();
        c.add(Calendar.MONTH, -3);
        Date d1=c.getTime();
        c.add(Calendar.DAY_OF_MONTH, 1);
        Date d2=c.getTime();
        GetTasksByDateTask zad= new GetTasksByDateTask(d1, d2);
        baza.executeDbTask(zad);
        List<ServerTask> wynik = zad.getResults();
        BlockingQueue<DelayedServerTask> q = kolejki.getTasksToRevalidateQueue();
        Iterator<ServerTask> i = wynik.iterator();
        while(i.hasNext()){
            ServerTask z = i.next();
            if(!z.getStatus().czyPrzejscieDozwolone(TaskStatus.WZNOWIONE))continue;
            z.setStatus(TaskStatus.WZNOWIONE);
            q.offer(new DelayedServerTask(z,1));
        }
    }
    
}
}



